package br.com.prontuario.faces;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

import org.primefaces.event.SelectEvent;

import br.com.prontuario.entidade.Consulta;
import br.com.prontuario.entidade.Procedimento;
import br.com.prontuario.entidade.ProcedimentoConsulta;
import br.com.prontuario.enumgeral.CategoriaProcedimento;
import br.com.prontuario.enumgeral.PorteAnimal;
import br.com.prontuario.logica.contract.DefaultLogicaContract;
import br.com.prontuario.util.DoubleUtil;
import br.com.prontuario.util.FacesUtil;

@ManagedBean(name="procedimentoConsultaFaces")
@ViewScoped
public class ProcedimentoConsultaFaces extends FacesUtil {
	
	private static final long serialVersionUID = 1L;

	@ManagedProperty(value = "#{logicaDefault}")
	private DefaultLogicaContract<ProcedimentoConsulta> logicaProcedimentoConsulta;
	
	private Boolean exibirAnamnese = false;
	
	private Date dataProcedimento;
	
	private ProcedimentoConsulta procedimento = new ProcedimentoConsulta();
	
	private List<ProcedimentoConsulta> listaProcedimentos = new ArrayList<>();
	
	private Consulta consulta;
	
	public ProcedimentoConsultaFaces() {
		popularConsultaSession();
	}

	@PostConstruct
	public void init() {
	}
	
	public void adicionarProcedimento() {
		try {
			if (validarCampos()) {
				logicaProcedimentoConsulta.adicionar(procedimento);
				adicionarMensagem("Procedimento adicionado com sucesso");
			}
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao adicionar o Procedimento");
		}
		
		this.procedimento = new ProcedimentoConsulta();
	}
	
	public void popularConsultaSession() {
		Consulta consulta = (Consulta) getSession().getAttribute("consultaSelecionada");
		if (consulta != null) {
			this.consulta = consulta;
		}
	}
	
    public void retornoProcedimento(SelectEvent event) {
        Procedimento procedimento = (Procedimento) event.getObject();
        this.procedimento.setProcedimento(procedimento);
        this.popularDadosProcedimento();
        desabilitarDialog();
    }

	public void calculaValor() {
		Double comissao = null;
		if (this.consulta.getAnimal().getPorte().equals(PorteAnimal.PEQUENO)) {
			comissao = this.procedimento.getProcedimento().getPorcentagemComissaoPequeno();
		} else {
			comissao = this.procedimento.getProcedimento().getPorcentagemComissaoGrande();
		}
		
		if (comissao != null) {
			Double valorLiquido = DoubleUtil.calcularValorLiquido(this.procedimento.getTotalProcedimento(), this.procedimento.getPorcentagem());
			this.procedimento.setTotalLiquido(valorLiquido);
		}
	}
	
	public void calcularPorcentagem() {
		if (this.procedimento.getTotalProcedimento() != null && this.procedimento.getTotalLiquido() != null) {
			Double porcentagem = DoubleUtil.calcularPorcentagem(this.procedimento.getTotalProcedimento(), this.procedimento.getTotalLiquido());
			this.procedimento.setPorcentagem(porcentagem);
		}
	}
	
	public void popularDadosProcedimento() {
		this.popularConsultaSession();
		Procedimento proc = this.procedimento.getProcedimento();
		
		Double valorTotal = this.consulta.getAnimal().getPorte().equals(PorteAnimal.PEQUENO) ? proc.getValorTotalPequeno() : proc.getValorTotalGrande();
		Double valorComissao = this.consulta.getAnimal().getPorte().equals(PorteAnimal.PEQUENO) ? proc.getPorcentagemComissaoPequeno() : proc.getPorcentagemComissaoGrande();
		Double valorLiquido = this.consulta.getAnimal().getPorte().equals(PorteAnimal.PEQUENO) ? proc.getValorLiquidoPequeno() : proc.getValorLiquidoGrande();
		
		this.procedimento.setTotalProcedimento(valorTotal);
		this.procedimento.setPorcentagem(valorComissao);
		this.procedimento.setTotalLiquido(valorLiquido);
		
		exibirAnamnese = this.procedimento.getProcedimento().getCategoriaProcedimento().equals(CategoriaProcedimento.CONSULTA) ? true : false;
		
	}
	
	public boolean validarCampos() {
		boolean valido = true;
		
		if (this.consulta == null) {
			this.popularConsultaSession();
			procedimento.setConsulta(consulta);
		} else {
			procedimento.setConsulta(consulta);
		}
		
		if (this.procedimento.getProcedimento() == null) {
			valido = false;
			adicionarMensagem("O campo procedimento é obrigatório");
		}
		
		if (this.procedimento.getDataProcedimento() == null) {
			valido = false;
			adicionarMensagem("O campo data de procedimento é obrigatório");
		}
		
		return valido;
	}
	
	public Consulta getConsulta() {
		return consulta;
	}

	public void setConsulta(Consulta consulta) {
		this.consulta = consulta;
	}

	public Date getDataProcedimento() {
		return dataProcedimento;
	}

	public void setDataProcedimento(Date dataProcedimento) {
		this.dataProcedimento = dataProcedimento;
	}

	public void setLogicaProcedimentoConsulta(DefaultLogicaContract<ProcedimentoConsulta> logicaProcedimentoConsulta) {
		this.logicaProcedimentoConsulta = logicaProcedimentoConsulta;
	}

	public List<ProcedimentoConsulta> getListaProcedimentos() {
		return listaProcedimentos;
	}

	public void setListaProcedimentos(List<ProcedimentoConsulta> listaProcedimentos) {
		this.listaProcedimentos = listaProcedimentos;
	}

	public ProcedimentoConsulta getProcedimento() {
		return procedimento;
	}

	public void setProcedimento(ProcedimentoConsulta procedimento) {
		this.procedimento = procedimento;
	}

	public Boolean getExibirAnamnese() {
		return exibirAnamnese;
	}

	public void setExibirAnamnese(Boolean exibirAnamnese) {
		this.exibirAnamnese = exibirAnamnese;
	}
	
	
}